//
// Created by DengLibin on 2018/12/11 0011.
//
#include <iostream>
#include <string>
using namespace std;
/**
 * 类
 */
 class Demo
 {
 private:
     int age = 0;
     string name;
 public:
     Demo()
     {
         cout <<"无参构造函数"<<endl;
     }
     Demo(int age, string & name)
     {
         this->age = age;
         this->name = name;
         cout <<"有参构造函数"<<endl;
     }
     Demo(const Demo & demo)
     {
         cout <<"拷贝构造函数"<<endl;
         this->age = demo.age;
         this->name = demo.name;
     }
     ~Demo() //如果不手动写，编译器会自动加上而且加上inline（直接拷贝函数代码到函数调用的地方而不是真正的函数调用）关键字，
     // 如果继承（递归调用父类的析构函数）层次较深，则编译后的代码会很大
     //析构 函数 绝对不要抛出异常
     /**
      * 1）如果析构函数抛出异常，则异常点之后的程序不会执行，如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源，则这些动作不会执行，会造成诸如资源泄漏的问题。

2）通常异常发生时，c++的机制会调用已经构造对象的析构函数来释放资源，此时若析构函数本身也抛出异常，则前一个异常尚未处理，又有新的异常，会造成程序崩溃的问题。
      */
     {
         cout<<"析构函数"<<endl;
     }
     void show()
     {
         cout <<"age = "<<this->age<<endl;
         cout <<"name = "<<this->name<<endl;
     }
 };

 int main2()
 {
     string name = "小红";
     Demo * demo = new Demo(12,name);
     Demo * copyDemo =  demo; //不会调用拷贝构造函数
     cout << demo<<endl; //对象内存地址
     cout << copyDemo<<endl; //对象内存地址
     demo->show();
     copyDemo->show();
     Demo copyDemo2 = *demo; //栈中创建一个新的对象 会调用拷贝构造函数
     copyDemo2.show();
     delete demo;
     return 0;
 }


